package com.newtouch.bxzs.database.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.newtouch.bxzs.common.base.model.User;
import com.newtouch.bxzs.database.model.bo.*;
import com.newtouch.bxzs.database.model.vo.GetAppUserVO;
import com.newtouch.bxzs.database.model.vo.GetUserMenuListVO;
import com.newtouch.bxzs.database.model.vo.UpdateStateVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;

/**
 * 用户Mapper:
 *
 * <p>
 * <b>History:</b>
 * <table border="1">
 * <tr>
 * <th>Date</th>
 * <th>Operator</th>
 * <th>Memo</th>
 * </tr>
 * <tr>
 * <td>2021/1/6 17:57</td>
 * <td>tianshangzhu</td>
 * <td>Create</td>
 * </tr>
 * </table>
 *
 * @author tianshangzhu
 * @version 1.0.0
 * @since 1.0.0
 */
@Mapper
public interface UserMapper extends BaseMapper<User> {
    /**
     * 查询后台用户列表信息
     *
     * @param page    分页
     * @param keyWord 搜索关键词
     * @return IPage<PcUserListBO>
     */
    IPage<PcUserListBO> getUserList4Pc(@Param("page") Page<PcUserListBO> page, @Param("keyWord") String keyWord);

    /**
     * 查看后台用户详情信息
     *
     * @param userId 用户id
     * @return PcUseDetailBO
     */
    PcUseDetailBO getUserDetail4Pc(@Param("userId") String userId);

    /**
     * 启用/禁用app用户
     *
     * @param updateState4PcVO 参数
     */
    @Update("UPDATE ASSISTANT_USER SET IS_ENABLE = #{updateState4PcVO.enableFlag} WHERE USER_ID = #{updateState4PcVO.serviceId}")
    void updateState4App(@Param("updateState4PcVO") UpdateStateVO updateState4PcVO);

    /**
     * 删除后台用户,修改是否为平台管理用户字段值
     *
     * @param userIdList 用户id
     */
    void deletePcUserByUserId(@Param("userIdList") List<String> userIdList);

    /**
     * 重置后台用户登录密码
     *
     * @param userId   用户id
     * @param md5ofStr 初始密码加密后的密文
     */
    @Update("UPDATE ASSISTANT_USER SET USER_LOGIN_PASSWORD = #{md5ofStr} WHERE USER_ID = #{userId}")
    void resetPassword4Pc(@Param("userId") String userId, @Param("md5ofStr") String md5ofStr);

    /**
     * 后台用户添加/用户选择接的查询
     *
     * @param page    分页参数
     * @param keyWord 搜索关键词
     * @return IPage<AppUserList4AddPcUserBO>
     */
    IPage<AppUserList4AddPcUserBO> getAppUserList4AddPcUser(@Param("page") Page<AppUserList4AddPcUserBO> page, @Param("keyWord") String keyWord);

    /**
     * 检查后台用户账号是否存在
     *
     * @param username 账号
     * @return 是否存在，存在为1，不存在为空
     */
    @Select("SELECT 1 FROM ASSISTANT_USER WHERE USER_LOGIN_ACCOUNT_NUMBER = #{username} LIMIT 1")
    Integer checkExists4PcUsername(@Param("username") String username);

    /**
     * 查出用户机构id
     *
     * @param userId 用户id
     * @return organizationCode
     */
    @Select("SELECT USER_ORGANIZATION_CODE FROM ASSISTANT_USER WHERE USER_ID = #{userId}")
    String getOrganizationCodeByUserId(@Param("userId") String userId);

    /**
     * 获取登录用户所属机构及以下机构的App用户列表
     *
     * @param page            page
     * @param childOrgCodeArr 用户所属机构及子机构编码
     * @param keyWord         搜索词
     * @return IPage<AppUserListBO>
     */
    IPage<AppUserListBO> getUserList4App(@Param("page") Page<AppUserListBO> page, @Param("childOrgCodeArr") String[] childOrgCodeArr,
                                         @Param("keyWord") String keyWord);

    /**
     * 获取用户所有菜单
     *
     * @param getUserMenuListVO 参数
     * @return UserMenuListBO
     */
    UserMenuListBO getUserMenuList(@Param("getUserMenuListVO") GetUserMenuListVO getUserMenuListVO);

    /**
     * 启用/禁用后台用户
     *
     * @param userId     用户id
     * @param enableFlag 状态
     */
    @Update("UPDATE ASSISTANT_USER SET IS_ENABLE_PLATFORM_MANAGEMENT_USER = #{enableFlag} " +
            "WHERE USER_ID = #{userId}")
    void modifyPlatformManagementUserState(@Param("userId") String userId, @Param("enableFlag") int enableFlag);

    /**
     * 判断用户是否都是禁用的
     *
     * @param userIdList 用户id list
     * @return 统计数量
     */
    int checkPcUserIsEnable(@Param("userIdList") List<String> userIdList);

    /**
     * app端根据机构编码查询用户
     *
     * @param getAppUserVO 参数
     * @return 用户信息
     */
    @Select("SELECT USER_ID,USER_NAME,USER_JOB_NUMBER,USER_CERTIFICATE_TYPE,USER_CERTIFICATE_NUMBER FROM ASSISTANT_USER " +
            " WHERE USER_ORGANIZATION_CODE = #{getAppUserVO.organizationCode}" +
            " AND IS_ENABLE = 1 AND IS_DELETE = 0")
    List<AppSimpleUserBO> getAppSimpleUser(@Param("getAppUserVO") GetAppUserVO getAppUserVO);

    /**
     * 查询后台用户的启用/禁用状态
     *
     * @param userId 用户id
     * @return 是否启用
     */
    @Select("SELECT IS_ENABLE_PLATFORM_MANAGEMENT_USER FROM ASSISTANT_USER WHERE USER_ID = #{userId}")
    boolean selectPlatformManagementUserFlag(@Param("userId") String userId);
}
